home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / ADVANCED / DECAL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  2.4 KB  |  124 lines

  1.  
  2. /* decal.c - by Tom McReynolds, SGI */
  3.  
  4. /* An Example of decaling, using stencil */
  5.  
  6. #include <GL/glut.h>
  7. #include <stdlib.h>
  8.  
  9. /* ARGSUSED1 */
  10. void 
  11. key(unsigned char key, int x, int y)
  12. {
  13.   switch (key) {
  14.   case '\033':
  15.     exit(0);
  16.   }
  17. }
  18.  
  19. /* decal shape polygon onto base */
  20. void 
  21. decal_poly(void)
  22. {
  23.   glBegin(GL_QUADS);
  24.   glNormal3f(0.f, 0.f, -1.f);
  25.   glVertex3i(-2, 2, 0);
  26.   glVertex3i(-2, 3, 0);
  27.   glVertex3i(2, 3, 0);
  28.   glVertex3i(2, 2, 0);
  29.  
  30.   glVertex3f(-.5, -3.f, 0);
  31.   glVertex3f(-.5f, 2.f, 0);
  32.   glVertex3f(.5f, 2.f, 0);
  33.   glVertex3f(.5f, -3.f, 0);
  34.   glEnd();
  35. }
  36.  
  37. int angle = 0;
  38.  
  39. void 
  40. redraw(void)
  41. {
  42.   /* clear stencil each time */
  43.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  44.  
  45.   glEnable(GL_STENCIL_TEST);
  46.   glStencilFunc(GL_ALWAYS, 1, 1);
  47.   glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
  48.   glDepthFunc(GL_LESS);
  49.  
  50.   glPushMatrix();
  51.   glColor3f(1.f, 0.f, 0.f);
  52.   glTranslatef(0.f, 0.f, -10.f);
  53.   glScalef(5.f, 5.f, 5.f);
  54.   glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
  55.   glEnable(GL_NORMALIZE);
  56.   glutSolidDodecahedron();
  57.   glDisable(GL_NORMALIZE);
  58.   glPopMatrix();
  59.  
  60.   glStencilFunc(GL_EQUAL, 1, 1);
  61.   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  62.   glDepthFunc(GL_ALWAYS);
  63.  
  64.   glPushMatrix();
  65.   glTranslatef(0.f, 0.f, -10.f);
  66.   glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
  67.   glRotatef(58.285f, 0.f, 1.f, 0.f);
  68.   glTranslatef(0.f, 0.f, -7.265f);
  69.   glColor3f(0.f, 1.f, 0.f);
  70.   decal_poly();
  71.   glPopMatrix();
  72.  
  73.   glDisable(GL_STENCIL_TEST);
  74.  
  75.   glutSwapBuffers();
  76. }
  77.  
  78. void 
  79. anim(void)
  80. {
  81.   angle = (angle + 1) % 360;
  82.   glutPostRedisplay();
  83. }
  84.  
  85. void
  86. visible(int vis)
  87. {
  88.   if (vis == GLUT_VISIBLE)
  89.     glutIdleFunc(anim);
  90.   else
  91.     glutIdleFunc(NULL);
  92. }
  93.  
  94. int
  95. main(int argc, char *argv[])
  96. {
  97.   static GLfloat lightpos[] =
  98.   {10.f, 5.f, 0.f, 1.f};
  99.  
  100.   glutInit(&argc, argv);
  101.   glutInitWindowSize(512, 512);
  102.   glutInitDisplayMode(GLUT_STENCIL | GLUT_DEPTH | GLUT_DOUBLE);
  103.   (void) glutCreateWindow("decal");
  104.   glutDisplayFunc(redraw);
  105.   glutKeyboardFunc(key);
  106.   glutVisibilityFunc(visible);
  107.   glEnable(GL_DEPTH_TEST);
  108.   glMatrixMode(GL_PROJECTION);
  109.   glOrtho(-10., 10., -10., 10., 0., 20.);
  110.   glMatrixMode(GL_MODELVIEW);
  111.  
  112.   glEnable(GL_LIGHTING);
  113.   glEnable(GL_LIGHT0);
  114.   glEnable(GL_CULL_FACE);
  115.   glCullFace(GL_BACK);
  116.  
  117.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  118.   glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  119.   glEnable(GL_COLOR_MATERIAL);
  120.  
  121.   glutMainLoop();
  122.   return 0;             /* ANSI C requires main to return int. */
  123. }
  124.